package com.wx.generic.mark;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 对于通配符的测试
 * @author wangxun
 * @version 1.0
 * @description: 使用 ?
 * ? extends xx
 * ? super xx
 * @date 2021/1/20 4:55 下午
 */
public class MarkTest {
    @Test
    void test1(){
        int a = 19;
        long b = 200L;
        List<Object> objects = new ArrayList<>();
        List<Person> persons = new ArrayList<>();
        List<Student> students = new ArrayList<>();

        /**
         *  ? 相当于 [-∞,+∞] 负无穷 到 正无穷
         *  所以 ? 谁都可以表示
         *  但是不能 放入一个具体的值
         *  markList.add(new Student());
         *  因为可以用父类来表示子类,不能用子类表示父类
         *  ? 代表着很小的子类 你set进去的类型无法做到最小类型
         */
        List<?> markList = new ArrayList<>();
        markList = objects;
        markList = persons;
        markList = students;

        Object o = markList.get(0);


    }

    @Test
    void test2(){
        List<Object> objects = new ArrayList<>();
        List<Person> persons = new ArrayList<>();
        List<Student> students = new ArrayList<>();
        /**
         * <? extends Person> 代表了 [-∞,Person]
         * 支持的上限类型是 Person
         * 你传进去的类型 只能向下转型为Person,但是向下转型是不安全的
         * 一个Object类型怎么能变成Person呢 所以这种上限的支持 就不会让你去add
         *
         * markList = objects; 报错不支持
         *
         */
        List<? extends Person> markList = new ArrayList<>();
        markList = persons;
        markList = students;
        Object o = new Object();
        Person person = markList.get(0);

    }

    @Test
    void test3(){
        List<Object> objects = new ArrayList<>();
        List<Person> persons = new ArrayList<>();
        List<Student> students = new ArrayList<>();
        /**
         * <? super Person> 代表了 [Person,+∞]
         * 支持类型的下限是Person 可以添加Person类型 或者Person的子类 添加进去的都可以向上转型为Person
         * markList = objects; 报错不支持
         *
         */
        List<? super Person> markList = new ArrayList<>();
        markList = objects;
        markList = persons;

        markList.add(new Student());
        markList.add(new Person());

        Object object = markList.get(0);


        List<? extends Object>  list= new ArrayList<>();

    }


    @Test
    void test4(){
        List<? super Integer> lists = new ArrayList<>();
        lists.add(new Integer(1));
        Object x = lists.get(0);
        System.out.println(x);


    }

    @Test
    void test5(){
        List<? super Number> list=new ArrayList<Number>();
        list.add(2.0);
        list.add(3.0);
        list.add(1);

        Object object = list.get(0);

    }
}
